﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QListWidgetItem>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTabWidget>
#include <QListWidget>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QPushButton>
#include <QCheckBox>
#include <QList>
#include <QPixmap>
#include <QGraphicsPixmapItem>
#include <QMap>
#include <QGraphicsSceneMouseEvent>
#include <QObject>

#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QSlider>
#include <QLabel>

#include <QTimer>

struct ClothesInfo//服饰信息结构体
{
    QString name; //服饰名称
    QString path; //资源路径
    QString category; //类别（上衣，下衣，连衣裙，鞋子）
    QPoint dragOffset;     // 拖拽时的临时偏移（用于列表显示）
    QPoint wearOffset;     // 穿戴时的对齐偏移（相对于人物的精确位置）
};

struct OutfitCombo
{
    QString name; // 套装名称
    QString top;  // 对应上衣名称(为空表示使用连衣裙)
    QString dress; // 对应连衣裙名称(为空表示使用上衣+下装)
    QString bottom; // 对应下装名称
    QString shoes; // 对应鞋子名称
    QString comboImagePath; // 合成图路径
};

// 自定义可拖拽的图形项
class DragablePixmapItem :public QObject, public QGraphicsPixmapItem
{
     Q_OBJECT
public:
    explicit DragablePixmapItem(QGraphicsItem *parent = nullptr)
        : QGraphicsPixmapItem(parent), m_isWorn(false) {
        setFlag(ItemIsMovable); // 允许移动
        setFlag(ItemSendsGeometryChanges); // 位置变化时发送信号
        setAcceptHoverEvents(true); // 支持悬停

    }

    // 新增带名称参数的构造函数
       explicit DragablePixmapItem(const QString& name, QGraphicsItem *parent = nullptr)
           : QGraphicsPixmapItem(parent), m_name(name), m_isWorn(false) {
           setFlag(ItemIsMovable);
           setFlag(ItemSendsGeometryChanges);
           setAcceptHoverEvents(true);
       }



    QString name() const { return m_name;}

    // 标记是否已穿戴
    void setWorn(bool worn) { m_isWorn = worn; }
    bool isWorn() const { return m_isWorn; }

signals:
    void positionChanged(DragablePixmapItem* item); // 位置变化信号
    void hovered(bool isHovered); // 悬停信号

protected:
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) override {
        if (change == ItemPositionHasChanged) {
            emit positionChanged(this); // 位置变化时通知主窗口
        }
        return QGraphicsPixmapItem::itemChange(change, value);
    }

    void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override {
        emit hovered(true);
        QGraphicsPixmapItem::hoverEnterEvent(event);
    }

    void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override {
        emit hovered(false);
        QGraphicsPixmapItem::hoverLeaveEvent(event);
    }

    void mousePressEvent(QGraphicsSceneMouseEvent *event) override
    {
          qDebug() << "鼠标按下:" << m_name;
          QGraphicsPixmapItem::mousePressEvent(event);
      }

      void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
      {
          qDebug() << "鼠标释放:" << m_name;
          QGraphicsPixmapItem::mouseReleaseEvent(event);
      }


private:
    QString m_name;
    bool m_isWorn; // 标记是否已穿戴到身上
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public:
    void checkClothesCollision(DragablePixmapItem* clothesItem); // 声明
    void wearClothes(DragablePixmapItem* clothesItem); // 声明
    ClothesInfo getClothesInfoByItem(DragablePixmapItem* item);
    void updateBackground();

private:
    int m_currentScene; // 0:未设置, 1:房间, 2:教室
    bool m_showingCombo; // 是否正在显示合成图
    QString m_currentComboPath; // 当前合成图路径

    //中间展示区的图形视图和场景
    QGraphicsView *m_view;
    QGraphicsScene *m_scene;

    //左侧标签页的列表控件
    QListWidget *m_upcloList;
    QListWidget *m_downcloList;
    QListWidget *m_shoesList;
    QListWidget *m_dressList;

    //右侧功能按钮
    QPushButton *m_scene1Btn;
    QPushButton *m_scene2Btn;
    QPushButton *m_saveBtn;
    QPushButton *m_resetBtn;
    QPushButton *m_randomBtn;
    QPushButton *m_confirmBtn;  // 确认按钮
    QCheckBox *m_themeCheckBox;

    // BGM控制相关控件
        QPushButton *m_bgmToggleBtn; // BGM开关按钮
        QSlider *m_volumeSlider;     // 音量滑块
        QLabel *m_volumeLabel;       // 音量标签




    //存储所有服饰信息的列表
    QList<ClothesInfo> m_clothesList;

    //存储当前场景中的图形项（已修改为可拖拽类型）
    QGraphicsPixmapItem *m_sceneItem; //场景背景（不可拖拽）
    DragablePixmapItem *m_upcloItem; //当前上衣（可拖拽）
    DragablePixmapItem *m_downcloItem; //当前裤子（可拖拽）
    DragablePixmapItem *m_dressItem; //当前连衣裙（可拖拽）
    DragablePixmapItem *m_shoesItem; //当前鞋子（可拖拽）


    // BGM相关成员变量
        QMediaPlayer *m_bgmPlayer;
        bool m_bgmEnabled; // BGM是否启用
        QString m_bgmPath; // BGM文件路径

    //私有成员函数声明
    void loadCharacter();
    void loadClothes();
    void initUI();
    void initConnections();
    void clearCurrentClothes();
    void addClothesToScene(const ClothesInfo &info);
    ClothesInfo getClothesInfoByName(const QString &name);

    void adjustCharacterAndClothesScale(); // 调整人物和服饰缩放
    void centerCharacter();                // 居中人物
    void updateClothesScale(qreal scaleFactor); // 更新服饰缩放
    void updateComboScale(qreal scaleFactor); // 更新合成图缩放
    void updateClothesPosition();          // 更新服饰位置

    void testSound();
    void checkAudioDevices();

    // BGM相关函数
       void initBGM();                        // 初始化BGM
       void toggleBGM();                      // 切换BGM开关
       void setVolume(int volume);            // 设置音量

    //人物相关
    QGraphicsPixmapItem *m_characterItem; //人物形象（不可拖拽）
    QString m_characterPath;

    QList<OutfitCombo> m_outfitCombos; // 套装组合列表
    QGraphicsPixmapItem *m_comboItem; // 合成图项
    QVBoxLayout *rightLayout;  // 添加布局声明
    QLabel *m_loadingLabel;

    void loadOutfitCombos(); // 加载套装组合信息
    bool checkAndShowCombo(); // 检查并显示套装合成图

    bool showComboImage(const QString &imagePath); // 新增辅助函数
    void hideCombo(); // 隐藏合成图，显示原始元素

    //服饰缩放比例
    const qreal m_clothesScale = 0.22;
    const qreal m_characterScale = 0.35;

    void adjustCharacterScale(qreal delta); // 调整缩放的辅助函数

protected:
    void resizeEvent(QResizeEvent *event) override;

 private slots:
    void onUpListItemClicked(QListWidgetItem* item);
    void onDownListItemClicked(QListWidgetItem* item);
    void onShoesListItemClicked(QListWidgetItem* item);
    void onDressListItemClicked(QListWidgetItem *item);

    void onScene1BtnClicked();
    void onScene2BtnClicked();
    void onSaveBtnClicked();
    void onResetBtnClicked();
    void onRandomBtnClicked();
    bool onConfirmBtnClicked();

    void onThemeCheckBoxToggled(bool checked);


    // BGM相关槽函数
       void onBgmToggleBtnClicked(); // BGM开关按钮点击
       void onVolumeChanged(int volume); // 音量变化
};
#endif // MAINWINDOW_H
